package com.chenlehao.filter;

import com.chenlehao.pojo.result;
import com.chenlehao.utils.ObjToJSON;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

// *代表拦截所有请求
@WebFilter("/*")
public class loginFilter implements Filter {
    // 创建方法, 服务器启动, 创建filter时调用, 只调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    // 拦截到请求时调用该方法, 可调用多次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 这个也是洋葱模型, 一层层的过滤器进, 到中间放行请求响应完毕后, 再一层层的出去, 各个过滤器的先后顺序与类名的字符串排序有关

        // 响应前拦截
        System.out.println("我在响应前拦截请求, 并执行");
        if (false) {
            // 如果过滤器不准通过, 则可以直接给客户端响应信息, 并return, 则请求不通过
            result res = result.error("登录失败");
            // 设置响应头部的Content-Type为application/json;charset=UTF-8, 避免中文乱码
            servletResponse.setContentType("application/json;charset=UTF-8");
            // 因为客户端需要返回一个JSON字符串, 所以必须要让对象转JSON
            servletResponse.getWriter().write(ObjToJSON.objToJson(res));
            return;
        }
        // 放行请求
        filterChain.doFilter(servletRequest, servletResponse);
        // 响应后执行
        System.out.println("我在响应后执行");
    }

    // 服务器销毁时调用, 只调用一次
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
